home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src890906.arc / IPCMD.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  5KB  |  246 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "internet.h"
  6. #include "timer.h"
  7. #include "netuser.h"
  8. #include "iface.h"
  9. #include "ip.h"
  10. #include "cmdparse.h"
  11. #include "commands.h"
  12.  
  13. extern char Badhost[];
  14.  
  15. static int dumproute __ARGS((void));
  16.  
  17. static int doadd __ARGS((int argc,char *argv[],void *p));
  18. static int dodrop __ARGS((int argc,char *argv[],void *p));
  19. static int doipaddr __ARGS((int argc,char *argv[],void *p));
  20. static int doipstat __ARGS((int argc,char *argv[],void *p));
  21. static int dortimer __ARGS((int argc,char *argv[],void *p));
  22. static int dottl __ARGS((int argc,char *argv[],void *p));
  23.  
  24. static struct cmds Ipcmds[] = {
  25.     "address",    doipaddr,    0,    0, NULLCHAR,
  26.     "rtimer",    dortimer,    0,    0, NULLCHAR,
  27.     "status",    doipstat,    0,    0, NULLCHAR,
  28.     "ttl",        dottl,        0,    0, NULLCHAR,
  29.     NULLCHAR,
  30. };
  31. int
  32. doip(argc,argv,p)
  33. int argc;
  34. char *argv[];
  35. void *p;
  36. {
  37.     return subcmd(Ipcmds,argc,argv,p);
  38. }
  39. static int
  40. doipaddr(argc,argv,p)
  41. int argc;
  42. char *argv[];
  43. void *p;
  44. {
  45.     int32 n;
  46.  
  47.     if(argc < 2) {
  48.         printf("%s\n",inet_ntoa(Ip_addr));
  49.     } else if((n = resolve(argv[1])) == 0){
  50.         printf(Badhost,argv[1]);
  51.         return 1;
  52.     } else
  53.         Ip_addr = n;
  54.     return 0;
  55. }
  56. static int
  57. dortimer(argc,argv,p)
  58. int argc;
  59. char *argv[];
  60. void *p;
  61. {
  62.     return setlong(&Ip_rtime,"IP reasm timeout (ms)",argc,argv);
  63. }
  64. static int
  65. dottl(argc,argv,p)
  66. int argc;
  67. char *argv[];
  68. void *p;
  69. {
  70.     return setshort(&Ip_ttl,"IP Time-to-live",argc,argv);
  71. }
  72.  
  73. /* "route" subcommands */
  74. static struct cmds Rtcmds[] = {
  75.     "add", doadd, 0, 3,
  76.     "route add <dest addr>[/<bits>] <if name> [gateway]",
  77.  
  78.     "drop", dodrop, 0, 2,
  79.     "route drop <dest addr>[/<bits>]",
  80.  
  81.     NULLCHAR,
  82. };
  83.  
  84. /* Display and/or manipulate routing table */
  85. int
  86. doroute(argc,argv,p)
  87. int argc;
  88. char *argv[];
  89. void *p;
  90. {
  91.     if(argc < 2){
  92.         return dumproute();
  93.     }
  94.     return subcmd(Rtcmds,argc,argv,p);
  95. }
  96. /* Add an entry to the routing table
  97.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  98.  */
  99. static int
  100. doadd(argc,argv,p)
  101. int argc;
  102. char *argv[];
  103. void *p;
  104. {
  105.     struct iface *ifp;
  106.     int32 dest,gateway;
  107.     unsigned bits;
  108.     char *bitp;
  109.  
  110.     if(strcmp(argv[1],"default") == 0){
  111.         dest = 0;
  112.         bits = 0;
  113.     } else {
  114.         if((dest = resolve(argv[1])) == 0){
  115.             printf(Badhost,argv[1]);
  116.             return 1;
  117.         }
  118.  
  119.         /* If IP address is followed by an optional slash and
  120.          * a length field, (e.g., 128.96/16) get it;
  121.          * otherwise assume a full 32-bit address
  122.          */
  123.         if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  124.             bitp++;
  125.             bits = atoi(bitp);
  126.         } else
  127.             bits = 32;
  128.     }
  129.     for(ifp=Ifaces;ifp != NULLIF;ifp = ifp->next){
  130.         if(strcmp(argv[2],ifp->name) == 0)
  131.             break;
  132.     }
  133.     if(ifp == NULLIF){
  134.         printf("Interface \"%s\" unknown\n",argv[2]);
  135.         return 1;
  136.     }
  137.     if(argc > 3){
  138.         if((gateway = resolve(argv[3])) == 0){
  139.             printf(Badhost,argv[3]);
  140.             return 1;
  141.         }
  142.     } else {
  143.         gateway = 0;
  144.     }
  145.     rt_add(dest,bits,gateway,ifp);
  146.     return 0;
  147. }
  148. /* Drop an entry from the routing table
  149.  * E.g., "drop 128.96/16
  150.  */
  151. static int
  152. dodrop(argc,argv,p)
  153. int argc;
  154. char *argv[];
  155. void *p;
  156. {
  157.     char *bitp;
  158.     unsigned bits;
  159.     int32 n;
  160.  
  161.     if(strcmp(argv[1],"default") == 0){
  162.         n = 0;
  163.         bits = 0;
  164.     } else {
  165.         /* If IP address is followed by an optional slash and length field,
  166.          * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  167.          */
  168.         if((bitp = strchr(argv[1],'/')) != NULLCHAR){
  169.             bitp++;
  170.             bits = atoi(bitp);
  171.         } else
  172.             bits = 32;
  173.  
  174.         if((n = resolve(argv[1])) == 0){
  175.             printf(Badhost,argv[1]);
  176.             return 1;
  177.         }
  178.     }
  179.     return rt_drop(n,bits);
  180. }
  181.  
  182. /* Dump IP routing table
  183.  * Dest              Length    Interface    Gateway          Use
  184.  * 192.001.002.003   32        sl0          192.002.003.004
  185.  */
  186. static int
  187. dumproute()
  188. {
  189.     register unsigned int i,bits;
  190.     register struct route *rp;
  191.  
  192.     printf("Dest              Length    Interface    Gateway          Use\n");
  193.     if(R_default.iface != NULLIF){
  194.         printf("default           0         %-13s",
  195.          R_default.iface->name);
  196.         if(R_default.gateway != 0)
  197.             printf("%-17s",inet_ntoa(R_default.gateway));
  198.         else
  199.             printf("%-17s","");
  200.         printf("%lu\n",R_default.uses);
  201.     }
  202.     for(bits=1;bits<=32;bits++){
  203.         for(i=0;i<NROUTE;i++){
  204.             for(rp = Routes[bits-1][i];rp != NULLROUTE;rp = rp->next){
  205.                 printf("%-18s",inet_ntoa(rp->target));
  206.                 printf("%-10u",bits);
  207.                 printf("%-13s",rp->iface->name);
  208.                 if(rp->gateway != 0)
  209.                     printf("%-17s",inet_ntoa(rp->gateway));
  210.                 else
  211.                     printf("%-17s","");
  212.                 printf("%lu\n",rp->uses);
  213.             }
  214.         }
  215.     }
  216.     return 0;
  217. }
  218.  
  219. static int
  220. doipstat(argc,argv,p)
  221. int argc;
  222. char *argv[];
  223. void *p;
  224. {
  225.     register struct reasm *rp;
  226.     register struct frag *fp;
  227.  
  228.     printf("IP: total %ld runt %u len err %u vers err %u",
  229.         Ip_stats.total,Ip_stats.runt,Ip_stats.length,Ip_stats.version);
  230.     printf(" chksum err %u badproto %u\n",
  231.         Ip_stats.checksum,Ip_stats.badproto);
  232.  
  233.     if(Reasmq != NULLREASM)
  234.         printf("Reassembly fragments:\n");
  235.     for(rp = Reasmq;rp != NULLREASM;rp = rp->next){
  236.         printf("src %s",inet_ntoa(rp->source));
  237.         printf(" dest %s",inet_ntoa(rp->dest));
  238.         printf(" id %u pctl %u time %lu len %u\n",
  239.             rp->id,uchar(rp->protocol),read_timer(&rp->timer),rp->length);
  240.         for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  241.             printf(" offset %u last %u\n",fp->offset,fp->last);
  242.         }
  243.     }
  244.     return 0;
  245. }
  246.